#include <stdio.h>
//1️⃣写一个函数可以判断一个数是不是素数
//素数（质数）：一个大于1的自然数，只能被1和自身整除的数
//2是质数，0和1既不是质数也不是合数
//判断一个自然数n是不是素数，就用n分别除以2~n-1这个范围中的自然数
//如果结果有整数，那就不是素数
//如果所有结果都有余数，即为素数
#include <math.h>
//第一种：无返回值
void sushu(int n)
{
    int i;
    //for(i=2;i<=n-1;i++)
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            printf("不是素数\n");
            break;//跳出for循环
        }
    }
    if(i>sqrt(n))
    {
        printf("是素数\n");
    }
}
int main()
{
    int a;
    scanf("%d",&a);
    if(a==1||a==0) //或者写成 a<=1
    {
        printf("既不是素数也不是合数\n");
    }
    else
    {
        sushu(a);
    }
    return 0;
}

//第二种：有返回值（返回值=1为素数，=0不为素数）
int sushu(int n)
{
    int i;
    for(i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
           return 0;//return功能很强，直接结束整个函数，函数彻底返回
        }
    }
    return 1;//所以这里不用像第一种加条件
}
int main()
{
    int a;
    scanf("%d",&a);
    if(a==1||a==0)
    {
        printf("既不是素数也不是合数\n");
    }
    else
    {
        if(sushu(a))//返回值 1 为真，打印输出  
        {           //返回值 0 为假，跳过
            printf("是素数\n");
        }
    }
    return 0;
}
//第一种和第二种的区别：第二种自定义函数功能单一，只有判断素数一个功能，没有第一种的打印功能，他人也方便调用
//高内聚低耦合

//2️⃣判断一年是不是闰年
//一般年份：能被4整除但不能被100整除，为闰年
//整百年份：能被400整除，为闰年
int year(int n)
{
    if(n%4==0&&n%100!=0||n%400==0)//也可写成if(n%4==0&&n%100!=0)
    {                             //        {}
        return 1;                 //       if(n%400==0)
    }                             //        {}
    else
    {
        return 0;
    }
}
int main()
{
    int a;
    scanf("%d",&a);
    if(year(a))
    {
        printf("是闰年\n");
    }
    return 0;
} 
//🔹布尔类型
#include <stdbool.h>
bool year(int n)
{
    if(n%4==0&&n%100!=0||n%400==0)
    {                            
        return true;//这里写成 return 1; 也没问题，但不建议              
    }                            
    else
    {
        return false;//这里写成 return 0; 也没问题，但不建议
    }
}
int main()
{
    int a;
    scanf("%d",&a);
    if(year(a))
    {
        printf("是闰年\n");
    }
    return 0;
} 

//3️⃣实现一个整形有序数组的查找  (见11.c二分查找法)
int binary_search(int arr[], int k,int sz)//形参和实参的名字可以相同，也可以不同
{                //形参arr看上去是数组，本质是指针变量
    int left = 0;
    int right = sz - 1;
    while (left <= right)
    { 
        int mid = (left + right) / 2;
        if (k>arr[mid])
        {
            left = mid + 1;
        }
        else if (k<arr[mid])
        {
            right = mid - 1;
        }
        else
        {
            return mid; //找到返回下标
        }
    }
    if (left > right)
    {
        return -1;     //找不到返回-1
    }
}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int k = 3;
    int ret = binary_search(arr, k, sz); //传参传数组名
    if (ret != -1)
    {
        printf("%d\n",ret);
    }
    return 0;
}

//4️⃣写一个函数，每调用一次这个函数，就会将num的值增加1
//第一种 无返回值
void rise(int*pn)
{
    (*pn)++;
}
int main()
{
    int num=0;
    rise(&num);
    return 0;
}
//第二种 有返回值
int rise(int n)
{
    return(n+1);//或者写成 return ++n;
    //这里不可以写成 return n++; 因为这样是先返回后++
}
int main()
{
    int num=0;
    num = rise(num);
    return 0;
}